package psico_test.appEjecutar;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.lang.reflect.Field;
import java.util.Vector;

import javax.realtime.AbsoluteTime;
import javax.realtime.Clock;
import javax.realtime.RealtimeThread;
import javax.realtime.RelativeTime;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.jdom.Element;

import psico_test.appEjecutar.gui.ventanaEjecutar;
import psico_test.appEjecutar.gui.ventanaPulsador;
import psico_test.utils.xml.XMLManager;


public class ManagerEjecucion extends javax.realtime.RealtimeThread
{
	private ventanaPulsador gui;
	private Thread threadGui;
	
	private JPanel panel;
	private JLabel texto;

	private Vector tiempos;
	private Vector textos;
	private Vector colores;

	private Vector tiemposRetardo;
	private Vector tiemposRespuesta;
	
	private File experimentos;

	private ventanaEjecutar vEjecutar;
	private appEjecutar controller;

	public ManagerEjecucion(appEjecutar controller,File experimento)
	{
		this.controller = controller;
		panel = controller.getGui().labelColor;
		texto = controller.getGui().labelTexto;

		tiemposRetardo = new Vector();
		tiemposRespuesta = new Vector();
		
		tiempos = new Vector();
		colores = new Vector();
		textos = new Vector();

		ObtenerDatos(experimento);
		
		gui = new ventanaPulsador(this);
		threadGui = new Thread(gui);
		threadGui.start();
		this.controller.getGui().setLocation(10,10);
	}

	private void ObtenerDatos(File experimento) 
	{
		Vector elementos = XMLManager.getInstance().leerExperimentoXML(experimento);
		for(int i=0; i<elementos.size(); i++)
		{
			Element aux = (Element) elementos.get(i);
			tiempos.add(aux.getAttributeValue("tiempo"));
			colores.add(aux.getAttributeValue("color"));
			textos.add(aux.getAttributeValue("texto"));
		}
	}

	
	public void run()
	{	
		try
		{
			this.sleep(3000);
			AbsoluteTime start = Clock.getRealtimeClock().getTime();
			
			for(int i=0; i<tiempos.size(); i++)
			{	
				
				RelativeTime tiempo = new RelativeTime(Long.parseLong(tiempos.get(i).toString()),0);
				Color color = (Color) Class.forName("java.awt.Color").getField(colores.get(i).toString()).get(null);
				String texto = textos.get(i).toString();

				this.panel.setBackground(color);
				this.texto.setText(texto);
				
				tiemposRetardo.add(Clock.getRealtimeClock().getTime());
				
				this.sleep(tiempo);
			}
			
			javax.swing.JOptionPane.showMessageDialog(panel,"Ha finalizado el experimento, traspasando resultados.");
			ManagerResultados.getInstance().traspasarResultados(start,tiemposRetardo,gui.getTiemposRespuesta());
			
			gui.dispose();
			panel.setBackground(Color.gray);
			texto.setText("");
		}
		catch(Exception e)
		{
			if(e instanceof NoSuchFieldException)
			{
				
				JOptionPane.showMessageDialog(panel,"Alguno de los colores del experimento no es parseable");
			}
			else
			{
				e.printStackTrace();
				JOptionPane.showMessageDialog(this.panel,"Fatal Error: "+e.hashCode()+"\nSe para el experimento");
			}
		}
	}
}
